%% copy riak-0.14.2 source to learn dynamo implementation and erlang
%% author: lichuang
%% copy source from riak_kv_pb_listener.erl
-module(edynamo_pb_listener).
-behaviour(gen_nb_server).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
	 terminate/2, code_change/3]).
-export([sock_opts/0, new_connection/2]).
-record(state, {port}).

start_link() ->
  Port = app_helper:get_env(edynamo, pb_port),
  IpAddr = app_helper:get_env(edynamo, pb_ip),
  gen_nb_server:start_link(?MODULE, IpAddr, Port, [Port]).

init([Port]) ->
  {ok, #state{port = Port}}.

sock_opts() ->
  [binary, {packet, 4}, {reuseaddr, true}].

handle_call(_Req, _From, State) ->
  {reply, not_implemented, State}.

handle_cast(_Msg, State) ->
  {noreply, State}.

handle_info(_Info, State) ->
  {noreply, State}.

terminate(_Reason, _State) ->
  ok.

code_change(_OldVsn, State, _Extra) ->
  {ok, State}.

new_connection(Socket, State) ->
  {ok, Pid} = edynamo_pb_socket_sup:start_socket(),
  ok = gen_tcp:controlling_process(Socket, Pid),
  ok = edynamo_pb_socket:set_socket(Pid, Socket),
  {ok, State}.
